var Config = require("../config");
var KOC = require("koc.common.utils");
var CommonUtils = require("./common-utils");

module.exports = {
    SendSMS: function (Value, callback) {
        if (typeof callback !== "function") {
            return;
        }
        Value = KOC.Lodash.extend({
            Nationcode: null, //国家码
            Phone: null, //手机号码
            Type: null, //0:普通短信;1:营销短信（强调：要按需填值，不然会影响到业务的正常使用）
            Sign: null, //短信签名，如果使用默认签名，则可以缺省此字段
            Message: null, //短信内容
            Template: null, //业务在控制台审核通过的模板ID 例：您的{1}是{2}，请于{3}分钟内填写。如非本人操作，请忽略本短信。
            Params: null, //参数列表，将依次替换模板中的参数 例：["验证码", "1234", "4"]
            Extend: null, //可选字段，默认没有开通(需要填空)。通道扩展码，在短信回复场景中，腾讯server会原样返回，开发者可依此区分是哪种类型的回复
            Ext: null //可选字段，不需要就填空。用户的session内容，腾讯server回包中会原样返回
        }, Value);
        Value.Phone = KOC.StringUtils.ToString(Value.Phone);
        if (!(/^1\d{10}$/).test(Value.Phone)) {
            callback(KOC.ReturnValue.New({
                hasError: true,
                message: "请输入正确的手机号"
            }));
            return;
        }
        if (!Value.Nationcode) {
            Value.Nationcode = "86";
        }
        if (!KOC.Lodash.includes(["0", "1"], Value.Type)) {
            Value.Type = "0";
        }
        if (!Value.Extend) {
            Value.Extend = "";
        }
        if (!Value.Ext) {
            Value.Ext = "";
        }
        Value.Template = KOC.StringUtils.ToInt(Value.Template);
        if (!Value.Message && (Value.Template <= 0 || !Value.Params)) {
            callback(KOC.ReturnValue.New({
                hasError: true,
                message: "短信发送失败:传入参数错误"
            }));
            return;
        }
        var options = {
            "tel": {
                "nationcode": Value.Nationcode,
                "phone": Value.Phone
            },
            "type": Value.Type,
            "sign": Value.Sign,
            "sig": KOC.StringUtils.MD5(Config.Interface.QCloud.SMS.APPKey + Value.Phone),
            "extend": Value.Extend,
            "ext": Value.Ext
        };
        if (Value.Message) {
            options["msg"] = Value.Message;
        } else {
            options["tpl_id"] = Value.Template;
            options["params"] = Value.Params;
        }
        KOC.Request({
            uri: "https://yun.tim.qq.com/v3/tlssmssvr/sendsms?sdkappid=" + Config.Interface.QCloud.SMS.APPID + "&random=" + Math.random(),
            method: "POST",
            json: true,
            body: options
        }, function (error, response, result) {
            if (error) {
                callback(KOC.ReturnValue.New({
                    hasError: true,
                    message: error.message
                }));
                return;
            }
            // 返回格式
            // {
            //     "result": "0", //0表示成功(计费依据)，非0表示失败
            //     "errmsg": "", //result非0时的具体错误信息
            //     "ext": "some msg", //用户的session内容，腾讯server回包中会原样返回
            //     "sid": "xxxxxxx", //标识本次发送id
            //     "fee": 1 //短信计费的条数
            // }
            if (!result || result.result !== "0") {
                callback(KOC.ReturnValue.New({
                    hasError: true,
                    message: "短信发送失败:" + result.errmsg + "(" + result.result + ")"
                }));
                return;
            }
            callback(KOC.ReturnValue.New({
                returnObject: {
                    Ext: result.ext,
                    SID: result.sid,
                    Fee: result.fee
                }
            }));
        });
    },
    SendSMS_VerifyCode: function (Phone, VerifyCode, callback) {
        this.SendSMS({
            Phone: Phone,
            Template: Config.Interface.QCloud.SMS.Template.VerifyCode,
            Params: [VerifyCode, KOC.StringUtils.ToString(CommonUtils.SMS.VerifyCode.Expired)]
        }, callback);
    }
};